package com.syn.com.syn.th;

import org.openjdk.jcstress.annotations.*;
import org.openjdk.jcstress.infra.results.I_Result;

//标记为并发测试类(会进行多轮压测)
@JCStressTest
//Outcome：描述测试结果id：接收结果    expect：期望处理结果  ACCEPTABLE：接受当前结果
@Outcome(id = {"1", "4", "0"}, expect = Expect.ACCEPTABLE_INTERESTING, desc = "压力测试")
//修饰的类必须是 public 的，不能是内部类，但是可以是静态内部类
@State
public class SyncOrdering {
    private Object object = new Object();
    int num = 0;
    boolean ready = false;

    /**
     * 标记方法使用多线程
     * 线程1执行的代码，I_Result 是一个对象
     * 有一个属性 r1 用来保存结果,通常是配合 toString 打印出来
     */
    @Actor
    public void actor1(I_Result r) {
        synchronized (object) {
            if (ready) {
                r.r1 = num + num;
            } else {
                r.r1 = 1;
            }
        }
    }

    /**
     * 标记方法使用多线程
     * 线程2执行的代码，I_Result 是一个对象
     * 有一个属性 r1 用来保存结果,通常是配合 toString 打印出来
     */
    @Actor
    public void actor2(I_Result r) {
        synchronized (object) {
            num = 2;
            ready = true;
        }
    }
}
